char *domain;
GHashTable *objects;
GSList *delayed_properties;
- GSList *signals;
+ GPtrArray *signals;
GSList *bindings;
char *filename;
char *resource_prefix;
#endif
g_hash_table_destroy (priv->objects);
-
- g_slist_free_full (priv->signals, (GDestroyNotify)_free_signal_info);
+ if (priv->signals)
+ g_ptr_array_free (priv->signals, TRUE);
G_OBJECT_CLASS (gtk_builder_parent_class)->finalize (object);
}
void
_gtk_builder_add_signals (GtkBuilder *builder,
- GSList *signals)
+ GPtrArray *signals)
{
GtkBuilderPrivate *priv = gtk_builder_get_instance_private (builder);
- priv->signals = g_slist_concat (priv->signals,
- g_slist_copy (signals));
+ if (G_UNLIKELY (!priv->signals))
+ priv->signals = g_ptr_array_new_with_free_func ((GDestroyNotify)_free_signal_info);
+
+ g_ptr_array_extend_and_steal (priv->signals, signals);
}
static gboolean
GError **error)
{
GtkBuilderPrivate *priv = gtk_builder_get_instance_private (builder);
- GSList *l;
GObject *object;
GObject *connect_object;
- gboolean result = FALSE;
+ gboolean result = TRUE;
- if (!priv->signals)
+ if (!priv->signals ||
+ priv->signals->len == 0)
return TRUE;
- priv->signals = g_slist_reverse (priv->signals);
- for (l = priv->signals; l; l = l->next)
+ for (guint i = 0; i < priv->signals->len; i++)
{
- SignalInfo *signal = (SignalInfo*)l->data;
+ SignalInfo *signal = g_ptr_array_index (priv->signals, i);
GClosure *closure;
g_assert (signal != NULL);
error);
if (closure == NULL)
- break;
+ {
+ result = false;
+ break;
+ }
g_signal_connect_closure_by_id (object,
signal->id,
closure,
signal->flags & G_CONNECT_AFTER ? TRUE : FALSE);
}
- if (l == NULL)
- result = TRUE;
- g_slist_free_full (priv->signals, (GDestroyNotify)_free_signal_info);
+ g_ptr_array_free (priv->signals, TRUE);
priv->signals = NULL;
return result;
{
/* Do not free the signal items, which GtkBuilder takes ownership of */
g_type_class_unref (info->oclass);
- g_slist_free (info->signals);
+ if (info->signals)
+ g_ptr_array_free (info->signals, TRUE);
if (info->properties)
g_ptr_array_free (info->properties, TRUE);
g_free (info->constructor);
if (GTK_IS_BUILDABLE (object_info->object) &&
GTK_BUILDABLE_GET_IFACE (object_info->object)->parser_finished)
data->finalizers = g_slist_prepend (data->finalizers, object_info->object);
- _gtk_builder_add_signals (data->builder, object_info->signals);
+
+ if (object_info->signals)
+ {
+ _gtk_builder_add_signals (data->builder, object_info->signals);
+ object_info->signals = NULL;
+ }
free_object_info (object_info);
}
ObjectInfo *object_info = (ObjectInfo*)state_peek_info (data, CommonInfo);
g_assert (object_info != NULL);
signal_info->object_name = g_strdup (object_info->id);
- object_info->signals = g_slist_prepend (object_info->signals, signal_info);
+
+ if (G_UNLIKELY (!object_info->signals))
+ object_info->signals = g_ptr_array_new ();
+
+ g_ptr_array_add (object_info->signals, signal_info);
}
else if (strcmp (element_name, "constant") == 0 ||
strcmp (element_name, "closure") == 0 ||
char *constructor;
GPtrArray *properties;
- GSList *signals;
+ GPtrArray *signals;
GSList *bindings;
GObject *object;
void _gtk_builder_add (GtkBuilder *builder,
ChildInfo *child_info);
void _gtk_builder_add_signals (GtkBuilder *builder,
- GSList *signals);
+ GPtrArray *signals);
gboolean _gtk_builder_finish (GtkBuilder *builder,
GError **error);
void _free_signal_info (SignalInfo *info,